﻿#ifndef WRWORKTCPCOMMCLIENTOBJECT_H
#define WRWORKTCPCOMMCLIENTOBJECT_H

#include "../WRWorkObject.h"
#include "WRWorkTcpCommClientSession.h"
#include "../../WRSoft-Utility/Structs/WRArray.h"

#include <QMutex>
#include <QSemaphore>

//声明工作TCP通讯客户端事务。
class WRWorkTcpCommClientAffair;
//声明工作TCP通讯客户端接口。
class WRWorkTcpCommClientInterface;

//表示工作TCP通讯客户对象。
class WRSOFT_WORKING_COMMON_CLASS WRWorkTcpCommClientObject : public WRWorkObject
{
    friend class WRWorkTcpCommClientAffair;

private:
    typedef WRWorkTcpCommClientAffair* Affair;
    typedef WRArray<Affair> Affars;
    typedef WRWorkTcpCommClientInterface* Interface;
    typedef WRArray<Interface> Interfaces;

    //表示处理项目。
    class ProcEntry
    {
    private:
        int m_serial;
        QUuid m_uuid;
        Interface m_target;
        QSemaphore m_mutex;

    public:
        //初始化处理项目。
        inline ProcEntry(const QUuid& uuid, int serial)
            : m_serial(serial), m_uuid(uuid), m_target(0)
        {
            //add code here
        }

        //获取标识。
        inline const QUuid& uuid(void) const
        {
            return m_uuid;
        }
        //获取序号。
        inline int serial(void) const
        {
            return m_serial;
        }

        //获取目标对象。
        inline Interface target(void) const
        {
            return m_target;
        }

        //等待完成。
        inline bool wait(int timeout = 10000)
        {
            return m_mutex.tryAcquire(1, timeout);
        }
        //完成处理。
        inline void fulfil(Interface target = 0)
        {
            m_target = target;
            m_mutex.release();
        }
    };

    WRType* m_type;
    int m_index;
    Affars m_affairs;
    Interfaces m_interfaces;
    QMutex m_mutex;
    int m_timeout;
    int m_sequence;
    ProcEntry* m_procEntry;
    QMutex m_procMutex;
    QList<WRWorkObject*> m_children;

    //执行复制操作。
    void copyTo(WRWorkTcpCommClientObject* obj);
    //根据当前对象创建新对象。
    WRWorkTcpCommClientObject* clone(WRWorkTcpCommClientObject* parent);

public:
    //初始化工作对象。
    WRWorkTcpCommClientObject(const WRWorkInformation& info, WRType* type, WRWorkTcpCommClientObject* parent, int index, int childCount);
    //初始化工作对象。
    WRWorkTcpCommClientObject(const WRWorkInformation& info, WRType* type, WRWorkTcpCommClientSession* session, int index, int childCount);

    //清理当前对象所占用的相关资源。
    virtual ~WRWorkTcpCommClientObject();

    //当加载后执行相应的初始工作。
    void init(void);

    //获取索引。
    inline int index(void) const
    {
        return m_index;
    }
    //获取会话。
    inline WRWorkTcpCommClientSession* session(void) const
    {
        return static_cast<WRWorkTcpCommClientSession*>(WRWorkObject::session());
    }

    //处理数据。
    void procData(const unsigned char* buf, int len);

    //根据当前对象创建新对象。
    WRWorkTcpCommClientObject* clone(WRWorkTcpCommClientSession* session);

    //获取当前工作对象类型。
    virtual WRType* type(void) const override;

    //创建工作事务。
    WRWorkTcpCommClientAffair* createAffair(int id , int index);

    //查询指定标识的工作处理者。
    virtual WRWorkDealer* queryWorkDealer(const QUuid &uuid) override;
    //查询指定标识的任务处理者。
    virtual WRTaskDealer* queryTaskDealer(const QUuid& uuid) override;
    //查询指定标识的数据源接口。
    virtual WRDataSource* queryDataSource(const QUuid& uuid) override;
    //查询指定标识的事件源接口。
    virtual WREventSource* queryEventSource(const QUuid& uuid) override;
    //查询指示标识的状态源接口。
    virtual WRStateSource* queryStateSource(const QUuid& uuid) override;
};

#endif // WRWORKTCPCOMMCLIENTOBJECT_H
